package org.bilinc.gz001.service;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.bilinc.gz001.UiTableData;
import org.bilinc.gz001.Utils;
import org.bilinc.gz001.dao.GazConstantDao;
import org.bilinc.gz001.dao.PositionDao;
import org.bilinc.gz001.entity.GazConstant;
import org.bilinc.gz001.entity.Position;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * User: Lalasianin
 * Date: 17.11.12
 * Time: 19:56
 * To change this template use File | Settings | File Templates.
 */
@Component
public class WorkingDataService {

    @Autowired
    PositionDao positionDao;

    @Autowired
    GazConstantDao gazConstantDao;

    private Integer GNV;
    private Double NO;

    public WorkingDataService() {
    }

    public void countFooterRows(UiTableData leftTableData, UiTableData rightTableData, UiTableData footerTableData) {  //TODO подумать как разбить на методы без ущерба призводительности
        footerTableData.clear();
        for (int i = 0; i<11; i++) {
            footerTableData.addRow(new ArrayList<String>(365));
        }
        List<String> dataOtdel = new ArrayList<String>();

        for (int cols = 0; cols < 365; cols++) {
            int count = 0;
            String texnologi = "";
            String atim = "";
            String evs = "";
            String mrs = "";
            String oks = "";

            int day = 0;
            int night = 0;
            int weekVahta = 0;
            int weekSubVahta = 0;
            int allSmena = 0;
            int allVahta = 0;
            String dayData = null;
            for (int rows = 0; rows < rightTableData.getRowCount(); rows++) {
                try {
                    dayData = rightTableData.getCell(rows, cols);
                } catch (Exception e) {
                    dayData = "";
                }
                if (dayData == null) {
                    dayData = "";
                }

                if (NumberUtils.isNumber(dayData)) {
                    int temp = NumberUtils.stringToInt(dayData);
                    if (temp == 11 ) {
                        day++;
                    } else if (temp == 12)  {
                        night++;
                    }

                } else {
                    if ("в".equals(dayData.toLowerCase()) ) {
                        weekVahta++;
                    } else if ("вв".equals(dayData.toLowerCase())) {
                        weekSubVahta++;
                    }
                }

                if (leftTableData.getRow(rows).size() == 2) {
                    count++;
                    switch (count) {
                        case 1:
                        case 2:
                        case 3:
                            dataOtdel.clear();
                            break;
                        case 4 :  //технологи
                            texnologi = countVerticalDataForPosition(dataOtdel);
                            dataOtdel.clear();
                            break;
                        case 5 :  //АТиМ
                            atim = countVerticalDataForPosition(dataOtdel);
                            dataOtdel.clear();
                            break;
                        case 6 :  //ЭВС
                            evs = countVerticalDataForPosition(dataOtdel);
                            dataOtdel.clear();
                            break;
                        case 7 :  //МРС
                            mrs = countVerticalDataForPosition(dataOtdel);
                            dataOtdel.clear();
                            break;
                        case 8 :  //ОКС
                            oks = countVerticalDataForPosition(dataOtdel);
                            dataOtdel.clear();
                            break;
                        default:
                            dataOtdel.clear();
                            break;
                    }
                } else {
                    dataOtdel.add(dayData);
                }

            }
            /*ДЕНЬ, НОЧЬ, ВЫХ(ВАХТА), ВЫХ(МЕЖВАХТА), ВСЕГО НА СМЕНЕ, ВСЕГО НА ВАХТЕ*/
            allSmena = day + night;
            allVahta = allSmena + weekVahta;
            footerTableData.addCellToRow(texnologi, 0);
            footerTableData.addCellToRow(atim, 1);
            footerTableData.addCellToRow(evs, 2);
            footerTableData.addCellToRow(mrs, 3);
            footerTableData.addCellToRow(oks, 4);
            footerTableData.addCellToRow(String.valueOf(day), 5);
            footerTableData.addCellToRow(String.valueOf(night), 6);
            footerTableData.addCellToRow(String.valueOf(weekVahta), 7);
            footerTableData.addCellToRow(String.valueOf(weekSubVahta), 8);
            footerTableData.addCellToRow(String.valueOf(allSmena), 9);
            footerTableData.addCellToRow(String.valueOf(allVahta), 10);
        }
        clearConstants();
    }


    /////////////////////////////////////////////////////////////////////////////////
    ////////////////////////ГОРИЗОНТАЛЬНЫЕ ФОРМУЛЫ///////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////

    /*Вычисляет число часов за год по челу
    * Сумма всех цифр + число отпусков*5,61*/
    public Double countHoursYear(List<String> data) {
        Double count = 0.0;
        for (String dayData: data) {
            if (dayData == null) {
                continue;
            }
            if (NumberUtils.isNumber(dayData)) {
                count += NumberUtils.stringToInt(dayData);
            }  else
            if ("о".equals(dayData.toLowerCase()) || "o".equals(dayData.toLowerCase())) {
                count += getNO();
            }
        }
        return count;
    }

    /*Вычисляет 1112 по челу за год
    * Число попаданий 11 и 12*/
    public Integer count1112(List<String> data) {
        Integer count = 0;
        for (String dayData: data) {
            if (dayData == null) {
                continue;
            }
            if (NumberUtils.isNumber(dayData)) {
                int hours = NumberUtils.stringToInt(dayData);
                if ((hours == 11) || (hours == 12) ) {
                    count ++;
                }
            }
        }
        return count;
    }

    /*Вычисляет отпуск по челу за год
    * Число попаданий 'о'*/
    public Integer countHolidaysYear(List<String> data) {
        Integer count = 0;
        for (String dayData: data) {
            if (dayData == null) {
                continue;
            }
            if (!NumberUtils.isNumber(dayData)) {
                if ("о".equals(dayData.toLowerCase()) || "o".equals(dayData.toLowerCase())) {
                    count ++;
                }
            }
        }
        return count;
    }

    /*Вычисляет разницу по челу за год
    * ГНВ - часов за год*/
    public Double countRaznica(List<String> data) {
        return getGNV() - countHoursYear(data);
    }

    private Integer getGNV() {
        if (GNV == null) {
            GNV = gazConstantDao.getGNV();
        }
        return GNV;
    }

    private Double getNO() {
        if (NO == null) {
            NO = gazConstantDao.getNO();
        }
        return NO;
    }
    public void clearConstants() {
        NO = null;
        GNV = null;
    }

    /*Вычисляет ВЭМ по челу за год
    * Число попаданий 11, 12, д, вв*/
    public Integer countVEM(List<String> data) {
        Integer count = 0;
        for (String dayData: data) {
            if (dayData == null) {
                continue;
            }
            if (NumberUtils.isNumber(dayData)) {
                int hours = NumberUtils.stringToInt(dayData);
                if ((hours == 11) || (hours == 12) ) {
                    count ++;
                }
            } else {
                if ("д".equals(dayData.toLowerCase()) || "вв".equals(dayData.toLowerCase())) {
                    count ++;
                }
            }
        }
        return count;
    }



    /*Вычисляет ЭИГНВ по челу за год
    * ГНВ/11- 1112загод*/
    public Double countEIGNV(List<String> data) {
        return (getGNV()/11 - Double.valueOf(count1112(data)));
    }

    /*Вычисляет все поля и возращает их в массиве в таком порядке:
      ЭИГНВ, ЧАСОВ ЗА ГОД, 1112ЗАГОД, ОТПУС, РАЗНИЦА, ВЭМ
    * Число попаданий 11, 12, д, вв*/
    public List<String> countLeftfields(List<String> data) {
        Double eignv = 0.0;
        Double hours = 0.0;
        int hours1112 = 0;
        int holidays = 0;
        Double raznica = 0.0;
        int vem = 0;

        for (String dayData: data) {
            if (dayData == null) {
                continue;
            }
            if (NumberUtils.isNumber(dayData)) {
                int temp = NumberUtils.stringToInt(dayData);
                hours += temp;
                if ((temp == 11) || (temp == 12) ) {
                    hours1112++;
                    vem++;
                }
            } else {
                if ("д".equals(dayData.toLowerCase()) || "вв".equals(dayData.toLowerCase())) {
                    vem++;
                } else if ("о".equals(dayData.toLowerCase()) || "o".equals(dayData.toLowerCase())) {
                    hours += getNO();
                    holidays++;
                }
            }
        }
        Integer GNV = getGNV();
        raznica = GNV-hours;
        eignv = (GNV/11 - Double.valueOf(hours1112));
        List<String> outData = new ArrayList<String>();
        outData.add(String.valueOf(eignv));
        outData.add(String.valueOf(hours));
        outData.add(String.valueOf(hours1112));
        outData.add(String.valueOf(holidays));
        outData.add(String.valueOf(raznica));
        outData.add(String.valueOf(vem));
        return outData;
    }

    /////////////////////////////////////////////////////////////////////////////////
    ////////////////////////ВЕРТИКАЛЬНЫЕ ФОРМУЛЫ/////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////

    /*Вычисляет вертикальные данные по позиции по челу за день
    * Число попаданий 11 и 12*/
    public String countVerticalDataForPosition(List<String> data) {
        Integer count = 0;
        for (String dayData: data) {
            if (dayData == null) {
                continue;
            }
            if (NumberUtils.isNumber(dayData)) {
                int hours = NumberUtils.stringToInt(dayData);
                if ((hours == 11) || (hours == 12) ) {
                    count ++;
                }
            }
        }
        if (count == 0) {
            return "";
        }
        return String.valueOf(count);
    }

    /*Вычисляет вертикальные поля и возращает их в массиве в таком порядке:
    ДЕНЬ, НОЧЬ, ВЫХ(ВАХТА), ВЫХ(МЕЖВАХТА), ВСЕГО НА СМЕНЕ, ВСЕГО НА ВАХТЕ */
    public List<String> countLowVerticalfield(List<String> data) {
        int day = 0;
        int night = 0;
        int weekVahta = 0;
        int weekSubVahta = 0;
        int allSmena = 0;
        int allVahta = 0;

        for (String dayData: data) {
            if (dayData == null) {
                continue;
            }
            if (NumberUtils.isNumber(dayData)) {
                int temp = NumberUtils.stringToInt(dayData);
                if (temp == 11 ) {
                    day++;
                } else if (temp == 12)  {
                    night++;
                }

            } else {
                if ("в".equals(dayData.toLowerCase()) ) {
                    weekVahta++;
                } else if ("вв".equals(dayData.toLowerCase())) {
                   weekSubVahta++;
                }
            }
        }
        allSmena = day + night;
        allVahta = allSmena + weekVahta;
        List<String> outData = new ArrayList<String>();
        outData.add(String.valueOf(day));
        outData.add(String.valueOf(night));
        outData.add(String.valueOf(weekVahta));
        outData.add(String.valueOf(weekSubVahta));
        outData.add(String.valueOf(allSmena));
        outData.add(String.valueOf(allVahta));
        return outData;
    }






}